【STM32 定时器(二)TIM 输入捕获PWM 总结】

您所在的位置:网站首页 stm32 pwm输入捕获中断函数为什么能循环 【STM32 定时器(二)TIM 输入捕获PWM 总结】

【STM32 定时器(二)TIM 输入捕获PWM 总结】

2024-07-10 21:17| 来源: 网络整理| 查看: 265

STM32定时器之输入捕获总结 OC介绍PWM介绍PWM初始化代码部分开启时钟配置时基单元配置CCR配置GPIO配置复用和重定义功能 开启定时器代码实现1 :实现呼吸灯代码实现2:驱动SG90舵机

OC介绍

在这里插入图片描述

PWM介绍

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

PWM参数计算 在这里插入图片描述 分辨率越细,分的分量越精细,越稳定,假如它为1%,则它可使得风扇以1为单位的等级调速。可以从1调到100档位,假如它为50%,那么只有两个档位。50和 100。

计算 :如果我现在想要生成一个 PWM频率为1KHZ,占空比可以为任意,PWM分辨率为1%,则PSC(分频器系数),ARR(重装值)应改为多少呢?

Reso分辨率=1%=1/100 ,又因为Reso=1/ARR+1 故而ARR=100-1=99。

PWM频率=1k=1000 = CK_PSC / (PSC+1)* (ARR + 1)

``由于CK_PSC在上篇文章中已经介绍,为72MHz。 故而

式子 CK_PSC / (PSC+1)* (ARR + 1)=PWM频率 变为 72000000 / (PSC + 1) *(99 + 1)=1000,故而PSC=720 -1

PWM初始化代码部分

挨个配置 打通这条路即可 在这里插入图片描述

开启时钟配置 //通用定时器TIM2时钟开启 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启GPIO的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //内部时钟配置(方便) TIM_InternalClockConfig(TIM2); 时基单元配置 //配置时基单元 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数的模式 TIM_TimeBaseInitStructure.TIM_Period=100 -1;//重装值ARR,根据上面公式计算 TIM_TimeBaseInitStructure.TIM_Prescaler=720 -1;//psc 根据上面公式计算 TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); CCR配置 //配置CCR TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(&TIM_OCInitStructure);//给所有成员变量先赋个初值 //下面单独修改通用定时器才用到的成员变量 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1 ;//PWM1模式,参考pptP68,PWM1模式和PWM2模式的区别 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//CNTPA15,则需要加这三行 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2 , ENABLE); //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//这行代码具体看被映射到的 //配置时基单元 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数的模式 TIM_TimeBaseInitStructure.TIM_Period=100 -1;//重装值ARR TIM_TimeBaseInitStructure.TIM_Prescaler=7200 -1;//psc TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); //配置CCR TIM_OCInitTypeDef TIM_OCInitStructure; //TIM_OCInitStructure.TIM_OCIdleState和TIM_OCInitStructure.TIM_OutputNState: Idle和里面含有N的一般都是高级定时器才用的 //我们用到的都是通用定时器,但TIM_OCInitStructure成员里面有我们用不到的,例如刚才的TIM_OCInitStructure.TIM_OCIdleState //那如果我们不给未用到的成员赋初值,那么后续就会有各种问题。 //这里可以使用TIM_OCStructInit()函数给所有成员给个默认值,然后单独再修改通用定时器模块的成员变量的值。 TIM_OCStructInit(&TIM_OCInitStructure);//给所有成员变量先赋个初值 //下面单独修改通用定时器才用到的成员变量 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1 ;//PWM1模式,参考pptP68,PWM1模式和PWM2模式的区别 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//CNTPA15,则需要将上面的引脚0,改为15,即 //GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); TIM_Cmd(TIM2,ENABLE);//开启定时器 } /** * @brief 设置占空比 * @param Compare:CCR,比较/捕获 占空比 * @retval 无 */ void PWM_SetCompare1(uint16_t Compare) { TIM_SetCompare1(TIM2,Compare); }

main .c

#include "stm32f10x.h" // Device header #include "OLED.h" #include "PWM.h" #include "Delay.h" uint8_t i; int main() { OLED_Init(); PWM_Init(); while(1) { for(i=0;iCCR设置为1000,1.5ms->CCR设置为1500,2ms->CCR设置为2000。

已知条件: Ferq=1/20ms(一个周期) =50Hz ; CK_PSC=72Mhz ; ARR+1=20k 这时将已知条件带入 第一个公式求频率的公式:Ferq=CK_PSC/ (PSC+1 ) * (ARR+1)可得

求得:PSC=72-1

还可采用其他CCR,ARR,PSC值搭配(但都没上面的方便)例如: 由50Hz计算 ARR和PSC,这里Reso分辨率用0.1,此时ARR仍为1000-1=99,计算PSC: CK_PSC =72000000 =50Hz *(psc+1) * (ARR+1) psc+1=7200/5 ;故而 PSC= 1440 -1

则ARR+1 =1000,仍按照上面计算占空比:CRR=25 ,ARR+1=1000 ,此时占空比为0.025,高电平时间为0.5ms 这样有个对应关系: 在这里插入图片描述

没上面的看着简洁明了。上面CCR=500 ->0.5ms,这里CCR=25 ->0.5。

代码配置(按照最上面的)这两行就可以这样写:

TIM_TimeBaseInitStructure.TIM_Period=72 -1;//重装值ARR TIM_TimeBaseInitStructure.TIM_Prescaler=20000-1;//psc 20k


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3